#include <stdio.h>
#include <cstdlib>
#include "./../h/mylibrary.h"

#define LENGTH(array) (sizeof(array) / sizeof(array[0]))
#define SUN  7

//结构体
struct Books {
    char title[50];
    char author[50];
    char subject[100];
    int book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};


//变量
extern char name[];

int x = 1;
int y = 23;

//方法
void test1();

void test2() {
    printf("test2()方法\n");
}

int max(int x, int y) {
    return x > y ? x : y;
}

int getRandomValue() {
    return rand();
}

void populate_array(int my_array[], size_t arraySize, int (*m)()) {
    for (int i = 0; i < arraySize; ++i) {
        my_array[i] = m();
    }
}

void printBook(struct Books b) {
    printf("Book title : %s\n", book.title);
    printf("Book author : %s\n", book.author);
    printf("Book subject : %s\n", book.subject);
    printf("Book book_id : %d\n", book.book_id);
}

void printBookPoint(struct Books *bk) {
    printf("Book title : %s\n", bk->title);
    printf("Book author : %s\n", bk->author);
    printf("Book subject : %s\n", bk->subject);
    printf("Book book_id : %d\n", bk->book_id);
}


int main() {
    //1.获取int占用空间大小
    printf("int 存储大小 : %lu \n", sizeof(char));

    //2.隐式类型转换
    int i = 10;
    float f = 3.14;
    double d = i + f; // 隐式将int类型转换为double类型

    //3.显示转换
    double pi = 3.14159;
    int pi_z = (int) pi; // 显式将double类型转换为int类型


    //4.指针变量，p指的是value的内存地址，*p指的value的值
    int value = 10;
    int *p = &value;
    int val = *p; // val 现在是 10，即 value 的值
    printf("%d\n", p);//value的内存地址
    printf("%d\n", *p);//value的值
    printf("%d\n", val);//value的值


    int *ptr;
    ptr = &value;
    printf("value 内存地址：%d\n", ptr);//value的内存地址
    printf("value 完整内存地址：%p\n", ptr);//value的内存地址,十六进制


    //5.extern 导入外部变量
    extern int age;
    printf("%d\n", age);
    printf("%s\n", name);

    //下边注释方法报错
    extern void printExternVariables();
//    printExternVariables();


    //6.引入头文件 方法，不需要extern
    sayHello();


    //7.引入方法,，这里为什么不需要 extern [  extern  int addtwonum(); ]
//    int addtwonum();
//    int result = addtwonum();
//    printf("result 为: %d\n", result);



    //8.
    //test1()在main方法后，需要声明
    //test2()在main方法前
    test1();
    test2();

    //9. sizeof()
    printf("int占用空间：%d\n", sizeof(age));


    //10.获取数组大小
    int array[] = {1, 2, 3, 4, 5};
    int length = sizeof(array) / sizeof(array[3]);
    printf("数组长度为: %d\n", length);


    //11.定义宏
    int ln = LENGTH(array);
    printf("数组长度为: %d\n", ln);


    //12.函数指针
    int (*z)(int, int) =max;

    //13.函数回调
    int my_array[10];
    populate_array(my_array, 10, getRandomValue);
    for (int i = 0; i < 10; i++) {
        printf("%d ", my_array[i]);
    }
    printf("\n");


    //14. "结构体" 作为形参
//    printBook(book);

    //15."结构体指针" 作为形参
    printBookPoint(&book);


    //16.typedef 定义别名
    //为基本类型定义别名
    typedef unsigned int type_alias_name;
    type_alias_name a;

    //为结构体定义别名
    typedef struct PP {
        int x;
        int y;
    } s, Point;
    Point p1; //s, 使用 Point 作为结构体的别名
    s p2;
    PP p3;


    //end
    return 0;


};

void test1() {
    printf("test1()方法\n");
}

